﻿using System;
using System.Collections.Generic;
using System.Linq;
using MiniExcelLibs;


namespace LPLS.Commons.ExcelOP
{

public static class ExcelHelper
{
    /// <summary>
    /// 从Excel文件中读取数据
    /// </summary>
    /// <param name="filePath">Excel文件的路径</param>
    /// <returns>包含Excel数据的IEnumerable<dynamic></returns>
    public static IEnumerable<dynamic> ReadExcel(string filePath)
    {
        try
        {
            return MiniExcel.Query(filePath);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"读取Excel文件时出错: {ex.Message}");
            return null;
        }
    }

    /// <summary>
    /// 将数据写入Excel文件
    /// </summary>
    /// <param name="filePath">Excel文件的路径</param>
    /// <param name="data">要写入的数据</param>
    public static void WriteExcel(string filePath, IEnumerable<dynamic> data)
    {
        try
        {
            MiniExcel.SaveAs(filePath, data);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"写入Excel文件时出错: {ex.Message}");
        }
    }

    /// <summary>
    /// 将数据写入Excel文件，支持指定工作表名称
    /// </summary>
    /// <param name="filePath">Excel文件的路径</param>
    /// <param name="data">要写入的数据</param>
    /// <param name="sheetName">工作表名称</param>
    public static void WriteExcel(string filePath, IEnumerable<dynamic> data, string sheetName)
    {
        try
        {
            MiniExcel.SaveAs(filePath, data,true, sheetName);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"写入Excel文件时出错: {ex.Message}");
        }
    }

    /// <summary>
    /// 读取Excel文件中的特定工作表
    /// </summary>
    /// <param name="filePath">Excel文件的路径</param>
    /// <param name="sheetName">工作表名称</param>
    /// <returns>包含Excel数据的IEnumerable<dynamic></returns>
    public static IEnumerable<dynamic> ReadSheet(string filePath, string sheetName)
    {
        try
        {
            return MiniExcel.Query(filePath,false, sheetName);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"读取Excel文件中的工作表时出错: {ex.Message}");
            return null;
        }
    }

    /// <summary>
    /// 获取Excel文件中的所有工作表名称
    /// </summary>
    /// <param name="filePath">Excel文件的路径</param>
    /// <returns>工作表名称列表</returns>
    public static List<string> GetSheetNames(string filePath)
    {
        try
        {
            return MiniExcel.GetSheetNames(filePath).ToList();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"获取Excel文件中的工作表名称时出错: {ex.Message}");
            return null;
        }
    }

    /// <summary>
    /// 根据条件过滤Excel文件中的数据
    /// </summary>
    /// <param name="filePath">Excel文件的路径</param>
    /// <param name="predicate">过滤条件</param>
    /// <returns>过滤后的数据</returns>
    public static IEnumerable<dynamic> FilterData(string filePath, Func<dynamic, bool> predicate)
    {
        try
        {
            var rows = MiniExcel.Query(filePath);
            return rows.Where(predicate);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"过滤Excel文件中的数据时出错: {ex.Message}");
            return null;
        }
    }

    /// <summary>
    /// 添加数据到现有的Excel文件
    /// </summary>
    /// <param name="filePath">Excel文件的路径</param>
    /// <param name="data">要添加的数据</param>
    public static void AppendData(string filePath, IEnumerable<dynamic> data)
    {
        try
        {
            MiniExcel.Insert(filePath, data);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"添加数据到Excel文件时出错: {ex.Message}");
        }
    }

    /// <summary>
    /// 添加数据到现有的Excel文件中的特定工作表
    /// </summary>
    /// <param name="filePath">Excel文件的路径</param>
    /// <param name="data">要添加的数据</param>
    /// <param name="sheetName">工作表名称</param>
    public static void AppendData(string filePath, IEnumerable<dynamic> data, string sheetName)
    {
        try
        {
            MiniExcel.Insert(filePath, data, sheetName);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"添加数据到Excel文件中的特定工作表时出错: {ex.Message}");
        }
    }
}

}
